package com.librelato.persistencia;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import com.librelato.bean.ChamadoBean;
import com.librelato.bean.EmpresaBean;
import com.librelato.bean.HistoricoBean;
import com.librelato.bean.TipoProblemaBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.persistencia.config.SQLConfiguracao;
import com.librelato.persistencia.enums.EnumCondicao;
import com.librelato.persistencia.interfaces.IChamadoDao;
import com.librelato.util.Ferramentas;

public class ChamadoDao<P extends ChamadoBean> extends DaoGenerico<P> implements
		IChamadoDao<P> {

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		// TODO Auto-generated method stub
		return null;
	}

	public void excluir(final P p) throws Exception {
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("exclui_chamado");
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getCodigo());
			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
	};

	@Override
	public P salvar(final P p) throws Exception {
		long codChamado = 0;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_max_chamado");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				codChamado = rs.getLong("MAXCOD");
			}
			p.setCodigo(codChamado);
			query = SQLConfiguracao.getInstance().getValor("insere_chamado");
			if (p.getChamadoAnterior().getCodigo() != null) {
				query += ",IDCHAMADOANT) VALUES(?,?,?,?,?,?,?,?,?,?)";
			} else {
				query += ") VALUES(?,?,?,?,?,?,?,?,?)";
			}
			ps = conn.prepareStatement(query);
			ps.setTimestamp(1, new Timestamp(p.getDataEmissao().getTime()));
			ps.setString(2, p.getDescricao());
			ps.setString(3, p.getTipoProblema().getDestinoChamado());
			ps.setLong(4, p.getCodigo());
			ps.setLong(5, p.getTipoProblema().getCodigo());
			ps.setLong(6, Long.parseLong(p.getUsuario().getCodigo()));
			ps.setBytes(7, p.getArquivo());
			ps.setString(8, "Aguardando Aprovação");
			ps.setString(9, p.getRamal());
			if (p.getChamadoAnterior().getCodigo() != null) {
				ps.setLong(9, p.getChamadoAnterior().getCodigo());
			}

			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;

		} finally {
			super.fecharRecursos(ps, rs);
		}
		return p;
	}

	public void aprovaChamado(P p) throws Exception {
		long maxCodHist = 0;
		Timestamp dataAprova = new Timestamp(new Date().getTime());
		String descricao = "Chamado Aprovado.";

		try {
			query = SQLConfiguracao.getInstance().getValor("aprova_chamado");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setTimestamp(1, new Timestamp(new Date().getTime()));
			ps.setTimestamp(2, new Timestamp(p.getDataPrevisao().getTime()));
			ps.setLong(3, Long.parseLong(p.getUsuarioResponsavel().getCodigo()));
			ps.setLong(4, p.getCodigo());
			ps.execute();
			conn.commit();
			/*
			 * query = SQLConfiguracao.getInstance().getValor(
			 * "localiza_max_historico"); ps = conn.prepareStatement(query); rs
			 * = ps.executeQuery(); if (rs.next()) { maxCodHist =
			 * rs.getLong("MAXCOD"); }
			 */
			maxCodHist = buscaMaxHistorico(conn, rs);
			query = SQLConfiguracao.getInstance().getValor("insere_historico");
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getCodigo());
			ps.setLong(2, maxCodHist);
			ps.setTimestamp(3, dataAprova);
			ps.setString(4, descricao);
			ps.setDouble(5, 0);
			ps.setLong(6, Long.parseLong(p.getUsuario().getCodigo()));
			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	};

	public void trocaDestinoChamado(P p) throws Exception {
		long maxCodHist = 0;
		Timestamp dataAprova = new Timestamp(new Date().getTime());
		String descricao = "Alterado Destino do Chamado para ";
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"altera_destino_chamado");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getTipoProblema().getDestinoChamado());
			ps.setLong(2, p.getTipoProblema().getCodigo());
			ps.setString(3, p.getDescricao());
			ps.setLong(4, p.getCodigo());
			ps.execute();
			conn.commit();
			maxCodHist = buscaMaxHistorico(conn, rs);
			query = SQLConfiguracao.getInstance().getValor("insere_historico");
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getCodigo());
			ps.setLong(2, maxCodHist);
			ps.setTimestamp(3, dataAprova);
			ps.setString(4, descricao + "'"
					+ p.getTipoProblema().getDestinoChamado() + "'.");
			ps.setDouble(5, 0);
			ps.setLong(6, Long.parseLong(p.getUsuario().getCodigo()));
			ps.execute();
			conn.commit();

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
	};

	public void negaChamado(P p) throws Exception {
		long maxCodHist = 0;
		Timestamp dataAprova = new Timestamp(new Date().getTime());
		String descricao = "Chamado Negado: ";
		try {
			conn = GerenciadorConexao.getConexao();
			maxCodHist = buscaMaxHistorico(conn, rs);
			query = SQLConfiguracao.getInstance().getValor("insere_historico");
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getCodigo());
			ps.setLong(2, maxCodHist);
			ps.setTimestamp(3, dataAprova);
			ps.setString(4, descricao + p.getHistoricos().get(0).getDescricao());
			ps.setDouble(5, 0);
			ps.setLong(6, Long.parseLong(p.getUsuario().getCodigo()));
			ps.execute();
			conn.commit();

			query = SQLConfiguracao.getInstance().getValor(
					"altera_status_chamado");
			ps = conn.prepareStatement(query);
			ps.setString(1, "Negado");
			ps.setLong(2, p.getCodigo());
			ps.execute();
			conn.commit();

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
	};

	@SuppressWarnings("unchecked")
	@Override
	public List<P> buscaChamadosNaoAprovados(Map<String, Object> param,
			final UsuarioBean p) throws Exception {
		ResultSet rs2 = null;
		ChamadoBean chamado;
		TipoProblemaBean tipoProblema;
		HistoricoBean historico;
		List<ChamadoBean> listaChamado = new ArrayList<ChamadoBean>();
		List<HistoricoBean> listaHistorico;
		int psIndex = 1;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_naprovados");

			if (param.get("DESTINOCHAMADO") != null) {
				query += " AND TIPOPROBLEMAS.DESTINO IN ('"
						+ param.get("DESTINOCHAMADO") + "')";
			}
			if (param.get("SOLICITANTE") != null) {
				query += " AND USUARIOS.IDUSER = ?";
			}
			if (param.get("IDCHAMADO") != null) {
				query += " AND CHAMADOS.IDCHAMADO = ?";
			}
			query += " ORDER BY CHAMADOS.IDCHAMADO DESC";
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			if (param.get("SOLICITANTE") != null) {
				ps.setLong(psIndex++, (long) param.get("SOLICITANTE"));
			}
			if (param.get("IDCHAMADO") != null) {
				ps.setLong(psIndex++, (long) param.get("IDCHAMADO"));
			}

			// if (!p.getTipo().equals("Gerente")) {
			// if (p.getTipo().equals("Coordenador")
			// && p.getTipoChamado().equals("Hardware")) {
			// query += " AND CHAMADOS.DESTINO IN ('Hardware','Comunicação')";
			// ps = conn.prepareStatement(query);
			// } else {
			// query += " AND CHAMADOS.DESTINO = ?";
			// ps = conn.prepareStatement(query);
			// ps.setString(1, p.getTipoChamado().trim());
			// }
			//
			// } else {
			// ps = conn.prepareStatement(query);
			// }
			//
			rs = ps.executeQuery();
			while (rs.next()) {
				tipoProblema = new TipoProblemaBean();
				tipoProblema.setCodigo(rs.getLong("IDTIPO_TP"));
				tipoProblema.setDescricao(rs.getString("DESCRICAO_TP"));
				tipoProblema.setDestinoChamado(rs.getString("DESTINO"));
				chamado = new ChamadoBean();
				chamado.setArquivo(rs.getBytes("ARQUIVO"));
				chamado.setTipoProblema(tipoProblema);
				chamado.setCodigo(rs.getLong("IDCHAMADO"));
				chamado.setStatus(rs.getString("STATUS").trim());
				chamado.setDataEmissao(new Date(rs.getTimestamp("DATAEMISSAO")
						.getTime()));
				chamado.setDescricao(rs.getString("DESCRICAO"));
				chamado.setUsuario(new UsuarioBean(
						rs.getLong("IDUSUARIO") + "", rs.getString("NOMEUSU")
								.trim(),
						new EmpresaBean(rs.getString("FILUSU"), rs
								.getString("FILDESC"))));
				if (rs.getString("EMAILUSU") != null) {
					chamado.getUsuario().setEmail(rs.getString("EMAILUSU"));
				} else {
					chamado.getUsuario().setEmail("");
				}
				if (rs.getString("RAMAL") != null) {
					chamado.setRamal(rs.getString("RAMAL"));
				} else {
					chamado.setRamal("");
				}
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_historico_chamado");
				ps = conn.prepareStatement(query);
				ps.setLong(1, chamado.getCodigo());
				rs2 = ps.executeQuery();
				listaHistorico = new ArrayList<HistoricoBean>();
				while (rs2.next()) {
					historico = new HistoricoBean();
					historico.setCodigo(rs2.getLong("IDHISTORICO"));
					historico.setDataEmissao(new Date(rs2.getTimestamp("DATA")
							.getTime()));
					historico.setDescricao(rs2.getString("DESCRICAO"));
					historico.setProgresso(rs2.getDouble("PROGRESSO"));
					historico.setUsuario(p);
					listaHistorico.add(historico);
				}
				chamado.setHistoricos(listaHistorico);
				listaChamado.add(chamado);
			}
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
		return (List<P>) listaChamado;
	}

	public void editar(final P p) throws Exception {
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor("altera_chamado");
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getDescricao());
			ps.setBytes(2, p.getArquivo());
			ps.setString(3, "Aguardando Aprovação");
			ps.setLong(4, p.getCodigo());
			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	};

	@SuppressWarnings("unchecked")
	@Override
	public List<P> buscaChamadosAberto(Map<String, String> param,
			final UsuarioBean p) throws Exception {
		ResultSet rs2 = null;
		ChamadoBean chamado;
		TipoProblemaBean tipoProblema;
		HistoricoBean historico;
		List<ChamadoBean> listaChamado = new ArrayList<ChamadoBean>();
		List<HistoricoBean> listaHistorico;
		UsuarioBean responsavel = null;
		int psIndex = 1;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_aberto");
			conn = GerenciadorConexao.getConexao();
			if (param.get("DESTINO") != null) {
				query += " AND CHAMADOS.DESTINO = ?";
			}
			if (param.get("STATUS") != null) {
				query += " AND STATUS = ?";
			}
			query += " LEFT JOIN USUARIOS AS RESP ON RESP.IDUSER = CHAMADOS.RESPONSAVEL";
			ps = conn.prepareStatement(query);
			ps.setLong(psIndex++, Long.parseLong(p.getCodigo()));
			if (param.get("DESTINO") != null) {
				ps.setString(psIndex++, param.get("DESTINO"));
			}
			if (param.get("STATUS") != null) {
				ps.setString(psIndex++, param.get("STATUS"));
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				responsavel = new UsuarioBean();
				responsavel.setCodigo(rs.getString("IDRESPONSAVEL"));
				responsavel.setNome(rs.getString("NOMERESPONSAVEL"));
				tipoProblema = new TipoProblemaBean();
				tipoProblema.setCodigo(rs.getLong("IDTIPO_TP"));
				tipoProblema.setDescricao(rs.getString("DESCRICAO_TP"));
				tipoProblema.setDestinoChamado(rs.getString("DESTINO"));
				chamado = new ChamadoBean();
				chamado.setUsuarioResponsavel(responsavel);
				chamado.setArquivo(rs.getBytes("ARQUIVO"));
				chamado.setTipoProblema(tipoProblema);
				chamado.setCodigo(rs.getLong("IDCHAMADO"));
				chamado.setStatus(rs.getString("STATUS").trim());
				chamado.setDataEmissao(new Date(rs.getTimestamp("DATAEMISSAO")
						.getTime()));
				if (rs.getDate("DATAAPROVACAO") != null) {
					chamado.setDataAprovacao(new Date(rs.getTimestamp(
							"DATAAPROVACAO").getTime()));
				}
				if (rs.getDate("DATAPREVISAO") != null) {
					chamado.setDataPrevisao(new Date(rs.getTimestamp(
							"DATAPREVISAO").getTime()));
				}
				if (rs.getDate("DATAENCERRAMENTO") != null) {
					chamado.setDataEncerrado(new Date(rs.getTimestamp(
							"DATAENCERRAMENTO").getTime()));
				}
				chamado.setDescricao(rs.getString("DESCRICAO"));
				chamado.setUsuario(p);

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_historico_chamado");
				ps = conn.prepareStatement(query);
				ps.setLong(1, chamado.getCodigo());
				rs2 = ps.executeQuery();
				listaHistorico = new ArrayList<HistoricoBean>();
				while (rs2.next()) {
					historico = new HistoricoBean();
					historico.setCodigo(rs2.getLong("IDHISTORICO"));
					historico.setDataEmissao(new Date(rs2.getTimestamp("DATA")
							.getTime()));
					historico.setDescricao(rs2.getString("DESCRICAO"));
					historico.setProgresso(rs2.getDouble("PROGRESSO"));
					historico.setUsuario(p);
					listaHistorico.add(historico);
				}

				chamado.setHistoricos(listaHistorico);
				if (listaHistorico.size() > 0) {
					chamado.setProgresso(listaHistorico.get(
							listaHistorico.size() - 1).getProgresso());
				} else {
					chamado.setProgresso(0.00);
				}

				listaChamado.add(chamado);
			}

		} catch (Exception e) {

			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
			if (rs2 != null) {
				rs2.close();
			}
		}

		return (List<P>) listaChamado;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<P> buscaChamadosFinalizado(Map<String, String> param,
			UsuarioBean p) throws Exception {

		ResultSet rs2 = null;
		ChamadoBean chamado;
		TipoProblemaBean tipoProblema;
		HistoricoBean historico;
		List<ChamadoBean> listaFinalizados = new ArrayList<ChamadoBean>();
		List<HistoricoBean> listaHistorico;
		UsuarioBean responsavel = null;
		int psIndex = 1;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_finalizado");
			if (param.get("DESCRICAO") != null) {
				query += " AND UPPER(DESCRICAO) LIKE UPPER(?)";
			}
			if (param.get("DATADE") != null) {
				query += " AND CONVERT(DATE,DATAEMISSAO,3) >= CONVERT(DATE,?,3)";
			}
			if (param.get("DATAATE") != null) {
				query += " AND CONVERT(DATE,DATAEMISSAO,3) <= CONVERT(DATE,?,3)";
			}
			if (param.get("DESTINO") != null) {
				query += " AND CHAMADOS.DESTINO = ?";
			}
			if (param.get("ASSUNTO") != null) {
				query += " AND IDTIPO_TP = ?";
			}

			query += " AND IDUSUARIO = ?";

			query += " LEFT JOIN USUARIOS AS RESP ON RESP.IDUSER = CHAMADOS.RESPONSAVEL";

			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);

			if (param.get("DESCRICAO") != null) {
				ps.setString(psIndex++, "%%" + param.get("DESCRICAO") + "%%");
			}
			if (param.get("DATADE") != null) {
				ps.setDate(
						psIndex++,
						new java.sql.Date(Ferramentas.formataData(
								param.get("DATADE"), "dd/MM/yy").getTime()));
			}
			if (param.get("DATAATE") != null) {
				ps.setDate(psIndex++, new java.sql.Date(Ferramentas
						.formataData(param.get("DATAATE"), "dd/MM/yy")
						.getTime()));
			}
			if (param.get("DESTINO") != null) {
				ps.setString(psIndex++, param.get("DESTINO"));
			}
			if (param.get("ASSUNTO") != null) {
				ps.setLong(psIndex++, Long.parseLong(param.get("ASSUNTO")));
			}
			ps.setLong(psIndex++, Long.parseLong(p.getCodigo()));
			rs = ps.executeQuery();
			while (rs.next()) {
				responsavel = new UsuarioBean();
				responsavel.setCodigo(rs.getString("IDRESPONSAVEL"));
				responsavel.setNome(rs.getString("NOMERESPONSAVEL"));
				tipoProblema = new TipoProblemaBean();
				tipoProblema.setCodigo(rs.getLong("IDTIPO_TP"));
				tipoProblema.setDescricao(rs.getString("DESCRICAO_TP"));
				tipoProblema.setDestinoChamado(rs.getString("DESTINO"));
				chamado = new ChamadoBean();
				chamado.setArquivo(rs.getBytes("ARQUIVO"));
				chamado.setTipoProblema(tipoProblema);
				chamado.setCodigo(rs.getLong("IDCHAMADO"));
				chamado.setDataEmissao(new Date(rs.getTimestamp("DATAEMISSAO")
						.getTime()));
				chamado.setUsuarioResponsavel(responsavel);
				if (rs.getDate("DATAAPROVACAO") != null) {
					chamado.setDataAprovacao(new Date(rs.getTimestamp(
							"DATAAPROVACAO").getTime()));
				}
				if (rs.getDate("DATAPREVISAO") != null) {
					chamado.setDataPrevisao(new Date(rs.getTimestamp(
							"DATAPREVISAO").getTime()));
				}
				if (rs.getDate("DATAENCERRAMENTO") != null) {
					chamado.setDataEncerrado(new Date(rs.getTimestamp(
							"DATAENCERRAMENTO").getTime()));
				}
				chamado.setDescricao(rs.getString("DESCRICAO"));
				chamado.setUsuario(p);

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_historico_chamado");
				ps = conn.prepareStatement(query);
				ps.setLong(1, chamado.getCodigo());
				rs2 = ps.executeQuery();
				listaHistorico = new ArrayList<HistoricoBean>();
				while (rs2.next()) {
					historico = new HistoricoBean();
					historico.setCodigo(rs2.getLong("IDHISTORICO"));
					historico.setDataEmissao(new Date(rs2.getTimestamp("DATA")
							.getTime()));
					historico.setDescricao(rs2.getString("DESCRICAO"));
					historico.setProgresso(rs2.getDouble("PROGRESSO"));
					historico.setUsuario(p);
					listaHistorico.add(historico);
				}

				chamado.setHistoricos(listaHistorico);
				if (listaHistorico.size() > 0) {
					chamado.setProgresso(listaHistorico.get(
							listaHistorico.size() - 1).getProgresso());
				} else {
					chamado.setProgresso(0.00);
				}

				listaFinalizados.add(chamado);

			}

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
			if (rs2 != null) {
				rs2.close();
			}
		}
		return (List<P>) listaFinalizados;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<P> buscaChamadosAtendidos(Map<String, Object> param,
			UsuarioBean p) throws Exception {

		ResultSet rs2 = null;
		ChamadoBean chamado;
		TipoProblemaBean tipoProblema;
		HistoricoBean historico;
		List<ChamadoBean> listaFinalizados = new ArrayList<ChamadoBean>();
		List<HistoricoBean> listaHistorico;
		int psIndex = 1;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_atendido");

			if (param.get("CHECKTODOS") == null
					|| !"S".equals(param.get("CHECKTODOS"))) {
				query += " AND (DATAENCERRAMENTO IS NOT NULL AND DATAENCERRAMENTO <> '') ";
			}

			if (param.get("DATADE") != null) {
				query += " AND CONVERT(DATE,DATAEMISSAO,3) >= CONVERT(DATE,?,3)";
			}
			if (param.get("DATAATE") != null) {
				query += " AND CONVERT(DATE,DATAEMISSAO,3) <= CONVERT(DATE,?,3)";
			}
			if (param.get("DESTINO") != null) {
				query += " AND CHAMADOS.DESTINO = ?";
			}
			if (param.get("ASSUNTO") != null) {
				query += " AND IDTIPO_TP = ?";
			}
			if (param.get("IDCHAMADO") != null) {
				query += " AND IDCHAMADO = ?";
			}
			if (param.get("SOLICITANTE") != null) {
				query += " AND IDUSUARIO = ?";
			}
			if (param.get("RESPONSAVEL") != null) {
				query += " AND RESPONSAVEL = ?";
			}

			if (p.getTipo().equals("Coordenador")) {
				if (p.getTipoChamado().equals("Hardware")) {
					query += " AND CHAMADOS.DESTINO IN ('"
							+ p.getTipoChamado().trim() + "','Comunicação')";
				} else if (p.getTipoChamado().equals("Engenharia")) {
					query += " AND CHAMADOS.DESTINO IN ('"
							+ p.getTipoChamado().trim() + "','Hardware')";
					if (param.get("RESPONSAVEL") == null) {
						query += " AND RESPONSAVEL = " + p.getCodigo();
					}
				} else {
					query += " AND CHAMADOS.DESTINO = '"
							+ p.getTipoChamado().trim() + "'";
				}
			} else if (p.getTipo().equals("Normal")) {
				query += " AND RESPONSAVEL = ?";
			}

			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);

			if (param.get("DATADE") != null) {
				ps.setDate(psIndex++, new java.sql.Date(Ferramentas
						.formataData((String) param.get("DATADE"), "dd/MM/yy")
						.getTime()));
			}
			if (param.get("DATAATE") != null) {
				ps.setDate(psIndex++, new java.sql.Date(Ferramentas
						.formataData((String) param.get("DATAATE"), "dd/MM/yy")
						.getTime()));
			}
			if (param.get("DESTINO") != null) {
				ps.setString(psIndex++, (String) param.get("DESTINO"));
			}
			if (param.get("ASSUNTO") != null) {
				ps.setLong(psIndex++, (long) param.get("ASSUNTO"));
			}
			if (param.get("IDCHAMADO") != null) {
				ps.setLong(psIndex++, (long) param.get("IDCHAMADO"));
			}
			if (param.get("SOLICITANTE") != null) {
				ps.setLong(psIndex++, (long) param.get("SOLICITANTE"));
			}
			if (param.get("RESPONSAVEL") != null) {
				ps.setLong(psIndex++, (long) param.get("RESPONSAVEL"));
			}
			if (p.getTipo().equals("Normal")) {
				ps.setLong(psIndex++, Long.parseLong(p.getCodigo()));
			}

			rs = ps.executeQuery();
			while (rs.next()) {

				tipoProblema = new TipoProblemaBean();
				tipoProblema.setCodigo(rs.getLong("IDTIPO_TP"));
				tipoProblema.setDescricao(rs.getString("DESCRICAO_TP"));
				tipoProblema.setDestinoChamado(rs.getString("DESTINO"));
				chamado = new ChamadoBean();
				chamado.setArquivo(rs.getBytes("ARQUIVO"));
				chamado.setTipoProblema(tipoProblema);
				chamado.setCodigo(rs.getLong("IDCHAMADO"));
				chamado.setRamal(rs.getString("RAMAL"));
				chamado.setDataEmissao(new Date(rs.getTimestamp("DATAEMISSAO")
						.getTime()));
				if (rs.getDate("DATAAPROVACAO") != null) {
					chamado.setDataAprovacao(new Date(rs.getTimestamp(
							"DATAAPROVACAO").getTime()));
				}
				if (rs.getDate("DATAPREVISAO") != null) {
					chamado.setDataPrevisao(new Date(rs.getTimestamp(
							"DATAPREVISAO").getTime()));
				}
				if (rs.getDate("DATAENCERRAMENTO") != null) {
					chamado.setDataEncerrado(new Date(rs.getTimestamp(
							"DATAENCERRAMENTO").getTime()));
				}
				chamado.setDescricao(rs.getString("DESCRICAO").trim());
				chamado.setUsuario(p);
				if (rs.getString("QUALIFICACAO") != null) {
					chamado.setQualificacao(rs.getString("QUALIFICACAO").trim());
				} else {
					chamado.setQualificacao("");
				}
				if (rs.getString("NOTA") != null) {
					chamado.setNotaChamado(rs.getInt("NOTA"));
				}
				if (rs.getString("OBSQUALIFICA") != null) {
					chamado.setObsQualifica(rs.getString("OBSQUALIFICA").trim());
				} else {
					chamado.setObsQualifica("");
				}
				chamado.setStatus(rs.getString("STATUS").trim());
				chamado.setChamadoAnterior(new ChamadoBean(rs
						.getLong("IDCHAMADOANT")));

				chamado.setUsuario(new UsuarioBean(
						rs.getLong("IDUSUARIO") + "", rs.getString("NOMEUSU")
								.trim(),
						new EmpresaBean(rs.getString("FILUSU"), rs
								.getString("FILDESC"))));
				if (rs.getString("EMAILUSU") != null) {
					chamado.getUsuario().setEmail(rs.getString("EMAILUSU"));
				} else {
					chamado.getUsuario().setEmail("");
				}
				if (rs.getString("RAMAL") != null) {
					chamado.setRamal(rs.getString("RAMAL"));
				} else {
					chamado.setRamal("");
				}
				chamado.setUsuarioResponsavel(new UsuarioBean(null, rs
						.getString("RESPONSAVEL_NOME"), null));
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_historico_chamado");
				ps = conn.prepareStatement(query);
				ps.setLong(1, chamado.getCodigo());
				rs2 = ps.executeQuery();
				listaHistorico = new ArrayList<HistoricoBean>();
				while (rs2.next()) {
					historico = new HistoricoBean();
					historico.setCodigo(rs2.getLong("IDHISTORICO"));
					historico.setDataEmissao(new Date(rs2.getTimestamp("DATA")
							.getTime()));
					historico.setDescricao(rs2.getString("DESCRICAO"));
					historico.setProgresso(rs2.getDouble("PROGRESSO"));
					historico.setUsuario(p);
					listaHistorico.add(historico);
				}

				chamado.setHistoricos(listaHistorico);
				chamado.setProgresso(listaHistorico.get(
						listaHistorico.size() - 1).getProgresso());
				listaFinalizados.add(chamado);
			}

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
			if (rs2 != null) {
				rs2.close();
			}
		}
		return (List<P>) listaFinalizados;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<P> buscaChamadosIniciar(Map<String, Object> param, UsuarioBean p)
			throws Exception {
		ResultSet rs2 = null;
		ChamadoBean chamado;
		TipoProblemaBean tipoProblema;
		HistoricoBean historico;
		List<ChamadoBean> listaChamado = new ArrayList<ChamadoBean>();
		List<HistoricoBean> listaHistorico;
		int psIndex = 1;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_iniciar");
			if (param.get("DESTINOCHAMADO") != null) {
				query += " AND TIPOPROBLEMAS.DESTINO IN ('"
						+ param.get("DESTINOCHAMADO") + "')";
			}
			if (param.get("SOLICITANTE") != null) {
				query += " AND USUARIOS.IDUSER = ?";
			}
			if (param.get("RESPONSAVEL") != null) {
				query += " AND RESPONSAVEL.IDUSER = ?";
			} else {
				if ("Engenharia".equals(p.getTipoChamado())) {
					query += " AND IDCHAMADO IN (SELECT IDCHAMADO FROM CHAMADOS WHERE DESTINO = 'Hardware' AND RESPONSAVEL.IDUSER = ?)";
				}
			}

			query += " ORDER BY STATUS, CASE WHEN PRIORIDADE = 'Alta' THEN 1 WHEN PRIORIDADE = 'Média' THEN 2 WHEN PRIORIDADE = 'Baixa' THEN 3 ELSE 4 END";
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			if (param.get("SOLICITANTE") != null) {
				ps.setLong(psIndex++, (long) param.get("SOLICITANTE"));
			}
			if (param.get("RESPONSAVEL") != null) {
				ps.setLong(psIndex++, (long) param.get("RESPONSAVEL"));
			} else {
				if ("Engenharia".equals(p.getTipoChamado())) {
					ps.setLong(psIndex++, Long.parseLong(p.getCodigo()));
				}
			}
			rs = ps.executeQuery();
			while (rs.next()) {
				tipoProblema = new TipoProblemaBean();
				tipoProblema.setCodigo(rs.getLong("IDTIPO_TP"));
				tipoProblema.setDescricao(rs.getString("DESCRICAO_TP"));
				tipoProblema.setDestinoChamado(rs.getString("DESTINO"));
				if (!"".equals(rs.getString("PRIORIDADE"))) {
					tipoProblema.setPrioridade(rs.getString("PRIORIDADE"));
				}
				chamado = new ChamadoBean();
				chamado.setArquivo(rs.getBytes("ARQUIVO"));
				chamado.setTipoProblema(tipoProblema);
				chamado.setCodigo(rs.getLong("IDCHAMADO"));
				chamado.setStatus(rs.getString("STATUS").trim());
				chamado.setRamal(rs.getString("RAMAL"));
				chamado.setDataEmissao(new Date(rs.getTimestamp("DATAEMISSAO")
						.getTime()));
				if (rs.getDate("DATAAPROVACAO") != null) {
					chamado.setDataAprovacao(new Date(rs.getTimestamp(
							"DATAAPROVACAO").getTime()));
				}
				if (rs.getDate("DATAPREVISAO") != null) {
					chamado.setDataPrevisao(new Date(rs.getTimestamp(
							"DATAPREVISAO").getTime()));
				}
				if (rs.getDate("DATAENCERRAMENTO") != null) {
					chamado.setDataEncerrado(new Date(rs.getTimestamp(
							"DATAENCERRAMENTO").getTime()));
				}
				chamado.setDescricao(rs.getString("DESCRICAO"));

				chamado.setUsuario(new UsuarioBean(
						rs.getLong("IDUSUARIO") + "", rs.getString("NOMEUSU")
								.trim(),
						new EmpresaBean(rs.getString("FILUSU"), rs
								.getString("FILDESC"))));
				chamado.setUsuarioResponsavel(new UsuarioBean(rs
						.getLong("CODRESP") + "", rs.getString("NOMERESP"),
						null));
				if (rs.getString("EMAILUSU") != null) {
					chamado.getUsuario().setEmail(rs.getString("EMAILUSU"));
				} else {
					chamado.getUsuario().setEmail("");
				}
				if (rs.getString("RAMAL") != null) {
					chamado.setRamal(rs.getString("RAMAL"));
				} else {
					chamado.setRamal("");
				}
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_historico_chamado");
				ps = conn.prepareStatement(query);
				ps.setLong(1, chamado.getCodigo());
				rs2 = ps.executeQuery();
				listaHistorico = new ArrayList<HistoricoBean>();
				while (rs2.next()) {
					historico = new HistoricoBean();
					historico.setCodigo(rs2.getLong("IDHISTORICO"));
					historico.setDataEmissao(new Date(rs2.getTimestamp("DATA")
							.getTime()));
					historico.setDescricao(rs2.getString("DESCRICAO"));
					historico.setProgresso(rs2.getDouble("PROGRESSO"));
					historico.setUsuario(p);
					listaHistorico.add(historico);
				}

				chamado.setHistoricos(listaHistorico);
				if (listaHistorico.size() > 0) {
					chamado.setProgresso(listaHistorico.get(
							listaHistorico.size() - 1).getProgresso());
				} else {
					chamado.setProgresso(0.00);
				}
				listaChamado.add(chamado);
			}
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
			if (rs2 != null) {
				rs2.close();
			}
		}
		return (List<P>) listaChamado;
	}

	public void iniciaChamado(P p) throws Exception {
		ResultSet rs2 = null;
		String descricao = "Chamado Iniciado.";
		long maxCodHist = 0;
		try {
			conn = GerenciadorConexao.getConexao();
			maxCodHist = buscaMaxHistorico(conn, rs2);
			query = SQLConfiguracao.getInstance().getValor("insere_historico");
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getCodigo());
			ps.setLong(2, maxCodHist);
			ps.setTimestamp(3, new Timestamp(new Date().getTime()));
			ps.setString(4, descricao);
			ps.setDouble(5, 0);
			ps.setLong(6, Long.parseLong(p.getUsuarioResponsavel().getCodigo()));
			ps.execute();
			conn.commit();
			query = SQLConfiguracao.getInstance().getValor(
					"altera_status_chamado");
			ps = conn.prepareStatement(query);
			ps.setString(1, "Em Andamento");
			ps.setLong(2, p.getCodigo());
			ps.execute();
			conn.commit();

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs2);
			if (rs2 != null) {
				rs2.close();
			}
		}

	};

	public void informaAndamento(P p) throws Exception {
		long maxCodHist = 0;
		try {
			conn = GerenciadorConexao.getConexao();
			maxCodHist = buscaMaxHistorico(conn, rs);
			query = SQLConfiguracao.getInstance().getValor("insere_historico");
			ps = conn.prepareStatement(query);
			ps.setLong(1, p.getCodigo());
			ps.setLong(2, maxCodHist);
			ps.setTimestamp(3, new Timestamp(new Date().getTime()));
			ps.setString(4, p.getHistoricos().get(0).getDescricao());
			ps.setDouble(5, p.getHistoricos().get(0).getProgresso());
			ps.setLong(6, Long.parseLong(p.getUsuarioResponsavel().getCodigo()));
			ps.execute();
			conn.commit();

		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}
	};

	private Long buscaMaxHistorico(Connection conn, ResultSet rs)
			throws Exception {
		long maxCod = 0;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_max_historico");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				maxCod = rs.getLong("MAXCOD");
			}
		} catch (Exception e) {
			throw e;
		}
		return maxCod;
	}

	public void insereQualificacao(final P p) throws Exception {

		try {
			query = SQLConfiguracao.getInstance().getValor(
					"insere_qualificacao");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setInt(1, p.getNotaChamado());
			ps.setString(2, p.getObsQualifica());
			ps.setTimestamp(3, new Timestamp(p.getDataEncerrado().getTime()));
			ps.setLong(4, p.getCodigo());
			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	};

	public void insereQualificacaoInsatisfeito(final P p) throws Exception {

		try {
			query = SQLConfiguracao.getInstance().getValor(
					"insere_qualificacao_insa");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getObsQualifica());
			ps.setTimestamp(2, new Timestamp(p.getDataEncerrado().getTime()));
			ps.setLong(3, p.getCodigo());
			ps.execute();
			conn.commit();
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

	};

	@Override
	public List<Long> estatisticaChamadoUsuario(final UsuarioBean p)
			throws Exception {
		List<Long> dados = new ArrayList<Long>();
		String query2;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_aberto_gra");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				dados.add(rs.getLong("TOTAL"));
			} else {
				dados.add((long) 0);
			}
			query2 = query + " AND IDUSUARIO = ?";
			ps = conn.prepareStatement(query2);
			ps.setLong(1, Long.parseLong(p.getCodigo()));
			rs = ps.executeQuery();
			if (rs.next()) {
				dados.add(rs.getLong("TOTAL"));
			} else {
				dados.add((long) 0);
			}

			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_fina_gra");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				dados.add(rs.getLong("TOTAL"));
			} else {
				dados.add((long) 0);
			}
			query2 = query + " AND IDUSUARIO = ?";
			ps = conn.prepareStatement(query2);
			ps.setLong(1, Long.parseLong(p.getCodigo()));
			rs = ps.executeQuery();
			if (rs.next()) {
				dados.add(rs.getLong("TOTAL"));
			} else {
				dados.add((long) 0);
			}
		} catch (Exception e) {
			throw e;
		} finally {
			super.fecharRecursos(ps, rs);
		}

		return dados;
	}

	@Override
	public List<List<String>> estatisticaTI(UsuarioBean p) throws Exception {
		ResultSet rs2 = null;
		// List<List<Long>> dadosGrafico = new ArrayList<List<Long>>();
		List<List<String>> dadosGrafico = new ArrayList<List<String>>();
		List<String> dadosDestino;
		long totChDestino = 0;
		long totChDesNApro = 0;
		long totChDesAbe = 0;
		long totChDesCon = 0;
		long totChDesAnd = 0;
		long totChDesNeg = 0;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamados_distintos");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			while (rs.next()) {
				dadosDestino = new ArrayList<String>();
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_total_chamado_destino");
				ps = conn.prepareStatement(query);
				ps.setString(1, rs.getString("DESTINO"));
				rs2 = ps.executeQuery();
				if (rs2.next()) {
					totChDestino = rs2.getLong("TOTAL");
				}
				if (totChDestino > 0) {

					dadosDestino.add("'" + rs.getString("DESTINO") + "'");
					dadosDestino.add(totChDestino + "");
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_total_chamado_aguarda");
					ps = conn.prepareStatement(query);
					ps.setString(1, rs.getString("DESTINO"));
					rs2 = ps.executeQuery();
					if (rs2.next()) {
						totChDesNApro = rs2.getLong("TOTAL");
					}
					dadosDestino.add(totChDesNApro + "");
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_total_chamado_aberto");
					ps = conn.prepareStatement(query);
					ps.setString(1, rs.getString("DESTINO"));
					rs2 = ps.executeQuery();
					if (rs2.next()) {
						totChDesAbe = rs2.getLong("TOTAL");
					}
					dadosDestino.add(totChDesAbe + "");
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_total_chamado_conclu");
					ps = conn.prepareStatement(query);
					ps.setString(1, rs.getString("DESTINO"));
					rs2 = ps.executeQuery();
					if (rs2.next()) {
						totChDesCon = rs2.getLong("TOTAL");
					}
					dadosDestino.add(totChDesCon + "");
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_total_chamado_andamen");
					ps = conn.prepareStatement(query);
					ps.setString(1, rs.getString("DESTINO"));
					rs2 = ps.executeQuery();
					if (rs2.next()) {
						totChDesAnd = rs2.getLong("TOTAL");
					}
					dadosDestino.add(totChDesAnd + "");
					query = SQLConfiguracao.getInstance().getValor(
							"localiza_total_chamado_negado");
					ps = conn.prepareStatement(query);
					ps.setString(1, rs.getString("DESTINO"));
					rs2 = ps.executeQuery();
					if (rs2.next()) {
						totChDesNeg = rs2.getLong("TOTAL");
					}
					dadosDestino.add(totChDesNeg + "");
					dadosGrafico.add(dadosDestino);
					totChDestino = 0;
					totChDesNApro = 0;
					totChDesAbe = 0;
					totChDesCon = 0;
					totChDesAnd = 0;
					totChDesNeg = 0;
				}
			}

		} catch (Exception e) {
			throw e;
		}

		return dadosGrafico;
	}

	@Override
	public List<List<String>> estatisticaAssunto(UsuarioBean p)
			throws Exception {
		ResultSet rs2 = null;
		List<List<String>> dadosGrafico = new ArrayList<List<String>>();
		List<String> dadosAssunto;
		long totChAssunto = 0;
		long totChDesNApro = 0;
		long totChDesAbe = 0;
		long totChDesCon = 0;
		long totChDesAnd = 0;
		query = SQLConfiguracao.getInstance().getValor(
				"localiza_assun_chamados_dist");
		conn = GerenciadorConexao.getConexao();
		if (p.getTipo().trim().equals("Normal")) {
			query += " AND CHAMADOS.DESTINO = ?";
			query += " AND CHAMADOS.RESPONSAVEL = ?";
			ps = conn.prepareStatement(query);
			ps.setString(1, p.getTipoChamado().trim());
			ps.setLong(2, Long.parseLong(p.getCodigo()));
		} else {
			if (p.getTipoChamado().trim().equals("Hardware")) {
				query += " AND CHAMADOS.DESTINO IN ('Hardware','Comunicação')";
				ps = conn.prepareStatement(query);
			} else {
				query += " AND CHAMADOS.DESTINO = ?";
				ps = conn.prepareStatement(query);
				ps.setString(1, p.getTipoChamado().trim());
			}
		}
		rs = ps.executeQuery();
		while (rs.next()) {
			dadosAssunto = new ArrayList<String>();

			query = SQLConfiguracao.getInstance().getValor(
					"localiza_total_ch_assunto");
			ps = conn.prepareStatement(query);
			ps.setLong(1, rs.getLong("IDTIPO"));
			ps.setString(2, p.getTipoChamado().trim());
			rs2 = ps.executeQuery();
			if (rs2.next()) {
				totChAssunto = rs2.getLong("TOTAL");
			}
			if (totChAssunto > 0) {
				dadosAssunto.add("'" + rs.getString("DESCRICAO") + "'");
				dadosAssunto.add(totChAssunto + "");

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_assun_ch_aguarda");
				ps = conn.prepareStatement(query);
				ps.setLong(1, rs.getLong("IDTIPO"));
				ps.setString(2, p.getTipoChamado().trim());
				rs2 = ps.executeQuery();
				if (rs2.next()) {
					totChDesNApro = rs2.getLong("TOTAL");
				}
				dadosAssunto.add(totChDesNApro + "");

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_assun_ch_aberto");
				ps = conn.prepareStatement(query);
				ps.setLong(1, rs.getLong("IDTIPO"));
				ps.setString(2, p.getTipoChamado().trim());
				rs2 = ps.executeQuery();
				if (rs2.next()) {
					totChDesAbe = rs2.getLong("TOTAL");
				}
				dadosAssunto.add(totChDesAbe + "");

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_assun_ch_concluido");
				ps = conn.prepareStatement(query);
				ps.setLong(1, rs.getLong("IDTIPO"));
				ps.setString(2, p.getTipoChamado().trim());
				rs2 = ps.executeQuery();
				if (rs2.next()) {
					totChDesCon = rs2.getLong("TOTAL");
				}
				dadosAssunto.add(totChDesCon + "");

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_assun_ch_andamento");
				ps = conn.prepareStatement(query);
				ps.setLong(1, rs.getLong("IDTIPO"));
				ps.setString(2, p.getTipoChamado().trim());
				rs2 = ps.executeQuery();
				if (rs2.next()) {
					totChDesAnd = rs2.getLong("TOTAL");
				}
				dadosAssunto.add(totChDesAnd + "");
				dadosGrafico.add(dadosAssunto);
				totChAssunto = 0;
				totChDesNApro = 0;
				totChDesAbe = 0;
				totChDesCon = 0;
				totChDesAnd = 0;

			}
		}

		return dadosGrafico;
	}

	@Override
	public void preSalvar(P p) {
	};

	public TreeMap<String, Map<String, Long>> buscaTotalPorStatus(
			java.sql.Date dataDe, java.sql.Date dataAte, String queryParam)
			throws Exception {

		Map<String, Long> totalPorSetor = new HashMap<String, Long>();
		TreeMap<String, Map<String, Long>> totalPorMes = new TreeMap<String, Map<String, Long>>();

		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(queryParam);
			ps = conn.prepareStatement(query, ResultSet.TYPE_SCROLL_SENSITIVE,
					ResultSet.CONCUR_UPDATABLE);
			ps.setDate(1, dataDe);
			ps.setDate(2, dataAte);
			ps.setDate(3, dataDe);
			ps.setDate(4, dataAte);
			rs = ps.executeQuery();
			while (rs.next()) {
				totalPorSetor.put(rs.getString("DESTINO"), rs.getLong("TOTAL"));
				totalPorMes.put(rs.getString("NMES"), totalPorSetor);
				if (rs.next()) {
					if (totalPorMes.get(rs.getString("NMES")) == null) {
						totalPorSetor = new HashMap<String, Long>();
						rs.previous();
					} else {
						rs.previous();
					}
				}
			}

		} catch (Exception e) {
			throw e;
		}

		return totalPorMes;
	}

	public TreeMap<String, Map<String, Long>> buscaTotalNotaMes(
			java.sql.Date dataDe, java.sql.Date dataAte) throws Exception {

		Map<String, Long> totalPorNota = new HashMap<String, Long>();
		TreeMap<String, Map<String, Long>> totalPorMes = new TreeMap<String, Map<String, Long>>();

		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_total_nota_mes");
			ps = conn.prepareStatement(query, ResultSet.TYPE_SCROLL_SENSITIVE,
					ResultSet.CONCUR_UPDATABLE);
			ps.setDate(1, dataDe);
			ps.setDate(2, dataAte);
			ps.setDate(3, dataDe);
			ps.setDate(4, dataAte);
			rs = ps.executeQuery();
			while (rs.next()) {
				totalPorNota.put(rs.getLong("NOTA") + "", rs.getLong("TOTAL"));
				totalPorMes.put(rs.getString("NMES"), totalPorNota);
				if (rs.next()) {
					if (totalPorMes.get(rs.getString("NMES")) == null) {
						totalPorNota = new HashMap<String, Long>();
						rs.previous();
					} else {
						rs.previous();
					}
				}
			}

		} catch (Exception e) {
			throw e;
		}

		return totalPorMes;
	}

	public List<ChamadoBean> buscaChamadosNaoQualificados(
			Map<String, String> param) throws Exception {
		List<ChamadoBean> chamados = new ArrayList<ChamadoBean>();
		ChamadoBean chamado = null;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_chamado_nao_finalizado");
			ps = conn.prepareStatement(query);
			ps.setLong(1, Long.parseLong(param.get("IDUSER")));
			rs = ps.executeQuery();
			while (rs.next()) {
				chamado = new ChamadoBean();
				chamado.setCodigo(rs.getLong("IDCHAMADO"));
				chamados.add(chamado);
			}

		} catch (Exception e) {
			throw e;
		}

		return chamados;

	}

}
